﻿using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using InfraWEB.DAL;
using InfraWEB.DAL.InfraTableAdapters;

namespace InfraWEB.BLL
{
	[System.ComponentModel.DataObject]
	public class Usuario
	{
		private UsuarioTableAdapter _usuarioAdapter = null;
		protected UsuarioTableAdapter Adapter
		{
			get
			{
				if (_usuarioAdapter == null)
				{
					_usuarioAdapter = new UsuarioTableAdapter();
				}
				return _usuarioAdapter;
			}
		}

		/// <summary>
		/// Obtém todos os usuários com Status true.
		/// </summary>
		/// <returns>Infra.Usuario.Datatable</returns>
		[System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select, true)]
		public Infra.UsuarioDataTable GetUsuarios()
		{
			return Adapter.GetUsuarios();
		}

		/// <summary>
		/// Obtém todos os usuários (independente de seu Status).
		/// </summary>
		/// <returns>Infra.Usuario.Datatable</returns>
		[System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select, false)]
		public Infra.UsuarioDataTable GetAllUsuarios()
		{
			return Adapter.GetAllUsuarios();
		}

		/// <summary>
		/// Obtém usuário pelo Id (Status do usuário deve ser true).
		/// </summary>
		/// <param name="id"></param>
		/// <returns>Infra.Usuario.Datatable</returns>
		[System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select, false)]
		public Infra.UsuarioDataTable GetUsuariosByUsuId(int id)
		{
			return Adapter.GetUsuarioByUsuId(id);
		}

		/// <summary>
		/// Obtém usuário pelo Login (Status do usuário deve ser true).
		/// </summary>
		/// <param name="login"></param>
		/// <returns>Infra.Usuario.Datatable</returns>
		[System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select, false)]
		public Infra.UsuarioDataTable GetUsuariosByUsuLogin(string login)
		{
			return Adapter.GetUsuarioByUsuLogin(login);
		}

		/// <summary>
		/// Obtém usuário pelo Email (Status do usuário deve ser true).
		/// </summary>
		/// <param name="email"></param>
		/// <returns>Infra.Usuario.Datatable</returns>
		[System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select, false)]
		public Infra.UsuarioDataTable GetUsuariosByUsuEmail(string email)
		{
			return Adapter.GetUsuarioByUsuEmail(email);
		}

		/// <summary>
		/// Verifica se existe login (Status do usuário deve ser true).
		/// </summary>
		/// <param name="login"></param>
		/// <returns>Infra.Usuario.Datatable</returns>
		public bool ChechIfLoginExists(string login)
		{
			Usuario user = new Usuario();
			if (user.GetUsuariosByUsuLogin(login).Count != 0)
			{
				return true;
			}
			else
			{
				return false;
			}
		}

		/// <summary>
		/// Persiste usuário no banco de dados.
		/// </summary>
		/// <param name="login"></param>
		/// <param name="senha"></param>
		/// <param name="nome"></param>
		/// <param name="email"></param>
		/// <param name="tipoUsuarioId"></param>
		/// <returns>true (caso o usuário seja persistido com sucesso)</returns>
		[System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Insert, true)]
		public bool RecordUsuario(string login, string senha, string nome, string email, int tipoUsuarioId)
		{
			// Cria uma instância nova de UsuarioRow
			Infra.UsuarioDataTable usuarioTable = new Infra.UsuarioDataTable();
			Infra.UsuarioRow usuarioRow = usuarioTable.NewUsuarioRow();
			if (login == string.Empty || senha == string.Empty || email == string.Empty)
			{
				// Erro: campos obrigatórios nulos
				return false;
			}
			if (nome == string.Empty)
			{
				nome = null;
			}
			usuarioRow.UsuLogin = login;
			usuarioRow.UsuSenha = senha;
			usuarioRow.UsuNome = nome;
			usuarioRow.UsuEmail = email;
			usuarioRow.UsuStatus = true;
			usuarioRow.UsuTipo = tipoUsuarioId;

			// Persiste o novo usuário
			usuarioTable.AddUsuarioRow(usuarioRow);
			int rowsAffected = Adapter.Update(usuarioTable);

			// Retorna true se for persistida exatamente uma única linha, caso contrário, false
			return (rowsAffected == 1);
		}

		/// <summary>
		/// Atualiza dados do usuário.
		/// </summary>
		/// <param name="id"></param>
		/// <param name="newLogin"></param>
		/// <param name="newSenha"></param>
		/// <param name="newNome"></param>
		/// <param name="newEmail"></param>
		/// <param name="newTipoUsuarioId"></param>
		/// <returns>true (caso o usuário seja persistido com sucesso)</returns>
		[System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Insert, true)]
		public bool RecordUsuario(int id, string newLogin, string newSenha, string newNome, string newEmail, int newTipoUsuarioId)
		{
			Infra.UsuarioDataTable usuarioTable = Adapter.GetUsuarioByUsuId(id);
			if (usuarioTable.Count == 0)
			{
				// Erro: usuário não existe
				return false;
			}

			// Obtém os dados do usuário identificado
			Infra.UsuarioRow usuarioRow = usuarioTable[0];
			if (newLogin == string.Empty || newSenha == string.Empty || newEmail == string.Empty || newTipoUsuarioId == null)
			{
				// Erro: campos obrigatórios nulos
				return false;
			}
			if (newNome == string.Empty)
			{
				newNome = null;
			}
			usuarioRow.UsuLogin = newLogin;
			usuarioRow.UsuSenha = newSenha;
			usuarioRow.UsuNome = newNome;
			usuarioRow.UsuEmail = newEmail;
			usuarioRow.UsuTipo = newTipoUsuarioId;

			// Atualiza o registro do usuário
			int rowsAffected = Adapter.Update(usuarioRow);

			// Retorna true se for atualizada exatamente uma única linha, caso contrário, false
			return (rowsAffected == 1);
		}

		/// <summary>
		/// Remove usuário (modifica o Status do usuário para false)
		/// </summary>
		[System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Delete, true)]
		public bool RemoveUsuario(int id)
		{
			Infra.UsuarioDataTable usuarioTable = Adapter.GetUsuarioByUsuId(id);
			Infra.UsuarioRow usuarioRow = usuarioTable[0];
			usuarioRow.UsuStatus = false;

			// Remove o usuário (status false)
			int rowsAffected = Adapter.Update(usuarioRow);

			// Retorna true se for atualizada exatamente uma única linha, caso contrário, false
			return true;
		}
	}
}
